"""用户认证模块的数据模型

定义用户相关的数据模型，包括自定义用户模型、用户配置等。
"""

import uuid
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import gettext_lazy as _


class User(AbstractUser):
    """自定义用户模型
    
    扩展Django默认用户模型，添加项目特定字段。
    """
    
    # 使用UUID作为主键，提高安全性
    id = models.UUIDField(
        primary_key=True,
        default=uuid.uuid4,
        editable=False,
        verbose_name=_('用户ID')
    )
    
    # 邮箱字段（必填且唯一）
    email = models.EmailField(
        _('邮箱地址'),
        unique=True,
        help_text=_('用户的邮箱地址，用于登录和通知')
    )
    
    # 用户头像
    avatar = models.ImageField(
        _('头像'),
        upload_to='avatars/%Y/%m/',
        blank=True,
        null=True,
        help_text=_('用户头像图片')
    )
    
    # 用户简介
    bio = models.TextField(
        _('个人简介'),
        max_length=500,
        blank=True,
        help_text=_('用户的个人简介，最多500字符')
    )
    
    # 用户偏好设置
    theme_preference = models.CharField(
        _('主题偏好'),
        max_length=10,
        choices=[
            ('light', _('浅色主题')),
            ('dark', _('深色主题')),
            ('auto', _('跟随系统')),
        ],
        default='auto',
        help_text=_('用户界面主题偏好')
    )
    
    # 语言偏好
    language_preference = models.CharField(
        _('语言偏好'),
        max_length=10,
        choices=[
            ('zh-hans', _('简体中文')),
            ('zh-hant', _('繁体中文')),
            ('en', _('English')),
        ],
        default='zh-hans',
        help_text=_('用户界面语言偏好')
    )
    
    # 邮件通知设置
    email_notifications = models.BooleanField(
        _('邮件通知'),
        default=True,
        help_text=_('是否接收邮件通知')
    )
    
    # 账户状态
    is_email_verified = models.BooleanField(
        _('邮箱已验证'),
        default=False,
        help_text=_('用户邮箱是否已验证')
    )
    
    # 最后活跃时间
    last_activity = models.DateTimeField(
        _('最后活跃时间'),
        auto_now=True,
        help_text=_('用户最后一次活跃的时间')
    )
    
    # 创建和更新时间
    created_at = models.DateTimeField(
        _('创建时间'),
        auto_now_add=True
    )
    
    updated_at = models.DateTimeField(
        _('更新时间'),
        auto_now=True
    )
    
    # 使用邮箱作为用户名字段
    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    
    class Meta:
        verbose_name = _('用户')
        verbose_name_plural = _('用户')
        db_table = 'auth_user'
        ordering = ['-created_at']
        indexes = [
            models.Index(fields=['email']),
            models.Index(fields=['is_active']),
            models.Index(fields=['created_at']),
        ]
    
    def __str__(self):
        """返回用户的字符串表示"""
        return f"{self.username} ({self.email})"
    
    def get_full_name(self):
        """获取用户全名"""
        return f"{self.first_name} {self.last_name}".strip() or self.username
    
    def get_short_name(self):
        """获取用户简称"""
        return self.first_name or self.username
    
    @property
    def display_name(self):
        """获取用户显示名称"""
        return self.get_full_name()


class UserProfile(models.Model):
    """用户配置模型
    
    存储用户的详细配置信息和偏好设置。
    """
    
    user = models.OneToOneField(
        User,
        on_delete=models.CASCADE,
        related_name='profile',
        verbose_name=_('用户')
    )
    
    # 编辑器配置
    editor_theme = models.CharField(
        _('编辑器主题'),
        max_length=20,
        choices=[
            ('vs', _('Visual Studio')),
            ('vs-dark', _('Visual Studio Dark')),
            ('hc-black', _('High Contrast Black')),
        ],
        default='vs',
        help_text=_('Markdown编辑器主题')
    )
    
    editor_font_size = models.PositiveSmallIntegerField(
        _('编辑器字体大小'),
        default=14,
        help_text=_('编辑器字体大小（像素）')
    )
    
    editor_font_family = models.CharField(
        _('编辑器字体'),
        max_length=100,
        default='Monaco, Menlo, "Ubuntu Mono", monospace',
        help_text=_('编辑器字体族')
    )
    
    # 自动保存设置
    auto_save_enabled = models.BooleanField(
        _('启用自动保存'),
        default=True,
        help_text=_('是否启用自动保存功能')
    )
    
    auto_save_interval = models.PositiveSmallIntegerField(
        _('自动保存间隔'),
        default=30,
        help_text=_('自动保存间隔时间（秒）')
    )
    
    # 同步设置
    sync_enabled = models.BooleanField(
        _('启用云端同步'),
        default=True,
        help_text=_('是否启用云端同步功能')
    )
    
    # 创建和更新时间
    created_at = models.DateTimeField(
        _('创建时间'),
        auto_now_add=True
    )
    
    updated_at = models.DateTimeField(
        _('更新时间'),
        auto_now=True
    )
    
    class Meta:
        verbose_name = _('用户配置')
        verbose_name_plural = _('用户配置')
        db_table = 'user_profile'
    
    def __str__(self):
        """返回用户配置的字符串表示"""
        return f"{self.user.username}的配置"


class LoginHistory(models.Model):
    """用户登录历史模型
    
    记录用户的登录历史，用于安全审计。
    """
    
    user = models.ForeignKey(
        User,
        on_delete=models.CASCADE,
        related_name='login_history',
        verbose_name=_('用户')
    )
    
    # 登录信息
    ip_address = models.GenericIPAddressField(
        _('IP地址'),
        help_text=_('用户登录时的IP地址')
    )
    
    user_agent = models.TextField(
        _('用户代理'),
        help_text=_('用户登录时的浏览器信息')
    )
    
    # 登录状态
    is_successful = models.BooleanField(
        _('登录成功'),
        default=True,
        help_text=_('登录是否成功')
    )
    
    failure_reason = models.CharField(
        _('失败原因'),
        max_length=100,
        blank=True,
        help_text=_('登录失败的原因')
    )
    
    # 时间信息
    login_time = models.DateTimeField(
        _('登录时间'),
        auto_now_add=True
    )
    
    logout_time = models.DateTimeField(
        _('登出时间'),
        null=True,
        blank=True
    )
    
    class Meta:
        verbose_name = _('登录历史')
        verbose_name_plural = _('登录历史')
        db_table = 'login_history'
        ordering = ['-login_time']
        indexes = [
            models.Index(fields=['user', '-login_time']),
            models.Index(fields=['ip_address']),
            models.Index(fields=['is_successful']),
        ]
    
    def __str__(self):
        """返回登录历史的字符串表示"""
        status = '成功' if self.is_successful else '失败'
        return f"{self.user.username} - {self.login_time.strftime('%Y-%m-%d %H:%M')} ({status})"
    
    @property
    def session_duration(self):
        """计算会话持续时间"""
        if self.logout_time:
            return self.logout_time - self.login_time
        return None
